GD/libgd/libgd.c

/* [<][>]
[^][v][top][bottom][index][help] */

FUNCTIONS

This source file includes following functions.
  1. gdImageCreate
  2. gdImageDestroy
  3. gdImageColorClosest
  4. gdImageColorExact
  5. gdImageColorAllocate
  6. gdImageColorDeallocate
  7. gdImageColorTransparent
  8. gdImageSetPixel
  9. gdImageBrushApply
  10. gdImageTileApply
  11. gdImageGetPixel
  12. gdImageLine
  13. gdImageDashedLine
  14. gdImageBoundsSafe
  15. gdImageChar
  16. gdImageCharUp
  17. gdImageString
  18. gdImageStringUp
  19. gdImageArc
  20. gdImageFillToBorder
  21. gdImageFill
  22. gdImageDump
  23. gdImageGifData
  24. gdImageGif
  25. gdImageGifPtr
  26. colorstobpp
  27. BumpPixel
  28. GIFNextPixel
  29. GIFEncode
  30. Putword
  31. Putchar
  32. ARGVAL
  33. MAXCODE
  34. MAXCODE
  35. HashTabOf
  36. CodeTabOf
  37. tab_prefixof
  38. tab_suffixof
  39. compress
  40. output
  41. cl_block
  42. cl_hash
  43. char_init
  44. char_out
  45. flush_char
  46. flush_char
  47. init_statics
  48. BitSet
  49. ReadOK
  50. LM_to_uint
  51. gdImageCreateFromGif
  52. ReadColorMap
  53. DoExtension
  54. GetDataBlock
  55. GetCode
  56. LWZReadByte
  57. ReadImage
  58. gdImageRectangle
  59. gdImageFilledRectangle
  60. gdImageCopy
  61. gdImageCopyResized
  62. gdGetWord
  63. gdPutWord
  64. gdGetByte
  65. gdImageCreateFromGd
  66. gdImageGdPtr
  67. gdImageGd
  68. fgets
  69. myfgets
  70. gdImageCreateFromXbm
  71. gdImagePolygon
  72. gdImageOpenPolygon
  73. gdImageFilledPolygon
  74. gdCompareInt
  75. gdImageSetStyle
  76. gdImageSetBrush
  77. gdImageSetTile
  78. gdImageInterlace
  79. allocDynamic
  80. appendDynamic
  81. reallocDynamic
  82. trimDynamic
  83. freeDynamic

#include <math.h>
#include <string.h>
#include <stdlib.h>
#include "io.h"
#include "gd.h"
#include "mtables.h"

#define TRUE 1
#define FALSE 0

static void gdImageBrushApply(gdImagePtr im, int x, int y);
static void gdImageTileApply(gdImagePtr im, int x, int y);

gdImagePtr gdImageCreate(int sx, int sy)
/* [<][>][^][v][top][bottom][index][help] */
{
        int i;
        gdImagePtr im;
        im = (gdImage *) malloc(sizeof(gdImage));
        im->pixels = (unsigned char **) malloc(sizeof(unsigned char *) * sx);
        im->polyInts = 0;
        im->polyAllocated = 0;
        im->brush = 0;
        im->tile = 0;
        im->style = 0;
        for (i=0; (i<sx); i++) {
                im->pixels[i] = (unsigned char *) calloc(
                        sy, sizeof(unsigned char));
        }       
        /* make sure that the colors are zeroed out */
        for (i=0; i < gdMaxColors; i++) {
          im->red[i]=0;
          im->green[i]=0;
          im->blue[i]=0;
        }
        im->sx = sx;
        im->sy = sy;
        im->colorsTotal = 0;
        im->transparent = (-1);
        im->interlace = 0;
        return im;
}

void gdImageDestroy(gdImagePtr im)
/* [<][>][^][v][top][bottom][index][help] */
{
        int i;

        if (im == NULL) return;
        for (i=0; (i<im->sx); i++) {
            free(im->pixels[i]);
        }       
        free(im->pixels);
        if (im->polyInts) {
                        free(im->polyInts);
        }
        if (im->style) {
                free(im->style);
        }
        free(im);
}

int gdImageColorClosest(gdImagePtr im, int r, int g, int b)
/* [<][>][^][v][top][bottom][index][help] */
{
        int i;
        long rd, gd, bd;
        int ct = (-1);
        long mindist = 0;
        for (i=0; (i<(im->colorsTotal)); i++) {
                long dist;
                if (im->open[i]) {
                        continue;
                }
                rd = (im->red[i] - r);  
                gd = (im->green[i] - g);
                bd = (im->blue[i] - b);
                dist = rd * rd + gd * gd + bd * bd;
                if ((i == 0) || (dist < mindist)) {
                        mindist = dist; 
                        ct = i;
                }
        }
        return ct;
}

int gdImageColorExact(gdImagePtr im, int r, int g, int b)
/* [<][>][^][v][top][bottom][index][help] */
{
        int i;
        for (i=0; (i<(im->colorsTotal)); i++) {
                if (im->open[i]) {
                        continue;
                }
                if ((im->red[i] == r) && 
                        (im->green[i] == g) &&
                        (im->blue[i] == b)) {
                        return i;
                }
        }
        return -1;
}

int gdImageColorAllocate(gdImagePtr im, int r, int g, int b)
/* [<][>][^][v][top][bottom][index][help] */
{
        int i;
        int ct = (-1);
        for (i=0; (i<(im->colorsTotal)); i++) {
                if (im->open[i]) {
                        ct = i;
                        break;
                }
        }       
        if (ct == (-1)) {
                ct = im->colorsTotal;
                if (ct == gdMaxColors) {
                        return -1;
                }
                im->colorsTotal++;
        }
        im->red[ct] = r;
        im->green[ct] = g;
        im->blue[ct] = b;
        im->open[ct] = 0;
        return ct;
}

void gdImageColorDeallocate(gdImagePtr im, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        /* Mark it open. */
        im->open[color] = 1;
}

void gdImageColorTransparent(gdImagePtr im, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        im->transparent = color;
}

void gdImageSetPixel(gdImagePtr im, int x, int y, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        int p;
        switch(color) {
                case gdStyled:
                if (!im->style) {
                        /* Refuse to draw if no style is set. */
                        return;
                } else {
                        p = im->style[im->stylePos++];
                }
                if (p != (gdTransparent)) {
                        gdImageSetPixel(im, x, y, p);
                }
                im->stylePos = im->stylePos %  im->styleLength;
                break;
                case gdStyledBrushed:
                if (!im->style) {
                        /* Refuse to draw if no style is set. */
                        return;
                }
                p = im->style[im->stylePos++];
                if ((p != gdTransparent) && (p != 0)) {
                        gdImageSetPixel(im, x, y, gdBrushed);
                }
                im->stylePos = im->stylePos %  im->styleLength;
                break;
                case gdBrushed:
                gdImageBrushApply(im, x, y);
                break;
                case gdTiled:
                gdImageTileApply(im, x, y);
                break;
                default:
                if (gdImageBoundsSafe(im, x, y)) {
                         im->pixels[x][y] = color;
                }
                break;
        }
}

static void gdImageBrushApply(gdImagePtr im, int x, int y)
/* [<][>][^][v][top][bottom][index][help] */
{
        int lx, ly;
        int hy;
        int hx;
        int x1, y1, x2, y2;
        int srcx, srcy;
        if (!im->brush) {
                return;
        }
        hy = gdImageSY(im->brush)/2;
        y1 = y - hy;
        y2 = y1 + gdImageSY(im->brush); 
        hx = gdImageSX(im->brush)/2;
        x1 = x - hx;
        x2 = x1 + gdImageSX(im->brush);
        srcy = 0;
        for (ly = y1; (ly < y2); ly++) {
                srcx = 0;
                for (lx = x1; (lx < x2); lx++) {
                        int p;
                        p = gdImageGetPixel(im->brush, srcx, srcy);
                        /* Allow for non-square brushes! */
                        if (p != gdImageGetTransparent(im->brush)) {
                                gdImageSetPixel(im, lx, ly,
                                        im->brushColorMap[p]);
                        }
                        srcx++;
                }
                srcy++;
        }       
}               

static void gdImageTileApply(gdImagePtr im, int x, int y)
/* [<][>][^][v][top][bottom][index][help] */
{
        int srcx, srcy;
        int p;
        if (!im->tile) {
                return;
        }
        srcx = x % gdImageSX(im->tile);
        srcy = y % gdImageSY(im->tile);
        p = gdImageGetPixel(im->tile, srcx, srcy);
        /* Allow for transparency */
        if (p != gdImageGetTransparent(im->tile)) {
                gdImageSetPixel(im, x, y,
                        im->tileColorMap[p]);
        }
}               

int gdImageGetPixel(gdImagePtr im, int x, int y)
/* [<][>][^][v][top][bottom][index][help] */
{
        if (gdImageBoundsSafe(im, x, y)) {
                return im->pixels[x][y];
        } else {
                return 0;
        }
}

/* Bresenham as presented in Foley & Van Dam */

void gdImageLine(gdImagePtr im, int x1, int y1, int x2, int y2, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        int dx, dy, incr1, incr2, d, x, y, xend, yend, xdirflag, ydirflag;
        dx = abs(x2-x1);
        dy = abs(y2-y1);
        if (dy <= dx) {
                d = 2*dy - dx;
                incr1 = 2*dy;
                incr2 = 2 * (dy - dx);
                if (x1 > x2) {
                        x = x2;
                        y = y2;
                        ydirflag = (-1);
                        xend = x1;
                } else {
                        x = x1;
                        y = y1;
                        ydirflag = 1;
                        xend = x2;
                }
                gdImageSetPixel(im, x, y, color);
                if (((y2 - y1) * ydirflag) > 0) {
                        while (x < xend) {
                                x++;
                                if (d <0) {
                                        d+=incr1;
                                } else {
                                        y++;
                                        d+=incr2;
                                }
                                gdImageSetPixel(im, x, y, color);
                        }
                } else {
                        while (x < xend) {
                                x++;
                                if (d <0) {
                                        d+=incr1;
                                } else {
                                        y--;
                                        d+=incr2;
                                }
                                gdImageSetPixel(im, x, y, color);
                        }
                }               
        } else {
                d = 2*dx - dy;
                incr1 = 2*dx;
                incr2 = 2 * (dx - dy);
                if (y1 > y2) {
                        y = y2;
                        x = x2;
                        yend = y1;
                        xdirflag = (-1);
                } else {
                        y = y1;
                        x = x1;
                        yend = y2;
                        xdirflag = 1;
                }
                gdImageSetPixel(im, x, y, color);
                if (((x2 - x1) * xdirflag) > 0) {
                        while (y < yend) {
                                y++;
                                if (d <0) {
                                        d+=incr1;
                                } else {
                                        x++;
                                        d+=incr2;
                                }
                                gdImageSetPixel(im, x, y, color);
                        }
                } else {
                        while (y < yend) {
                                y++;
                                if (d <0) {
                                        d+=incr1;
                                } else {
                                        x--;
                                        d+=incr2;
                                }
                                gdImageSetPixel(im, x, y, color);
                        }
                }
        }
}

/* As above, plus dashing */
#define dashedSet \
        { \
                dashStep++; \
                if (dashStep == gdDashSize) { \
                        dashStep = 0; \
                        on = !on; \
                } \
                if (on) { \
                        gdImageSetPixel(im, x, y, color); \
                } \
        }

void gdImageDashedLine(gdImagePtr im, int x1, int y1, int x2, int y2, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        int dx, dy, incr1, incr2, d, x, y, xend, yend, xdirflag, ydirflag;
        int dashStep = 0;
        int on = 1;
        dx = abs(x2-x1);
        dy = abs(y2-y1);
        if (dy <= dx) {
                d = 2*dy - dx;
                incr1 = 2*dy;
                incr2 = 2 * (dy - dx);
                if (x1 > x2) {
                        x = x2;
                        y = y2;
                        ydirflag = (-1);
                        xend = x1;
                } else {
                        x = x1;
                        y = y1;
                        ydirflag = 1;
                        xend = x2;
                }
                dashedSet;
                if (((y2 - y1) * ydirflag) > 0) {
                        while (x < xend) {
                                x++;
                                if (d <0) {
                                        d+=incr1;
                                } else {
                                        y++;
                                        d+=incr2;
                                }
                                dashedSet;
                        }
                } else {
                        while (x < xend) {
                                x++;
                                if (d <0) {
                                        d+=incr1;
                                } else {
                                        y--;
                                        d+=incr2;
                                }
                                dashedSet;
                        }
                }               
        } else {
                d = 2*dx - dy;
                incr1 = 2*dx;
                incr2 = 2 * (dx - dy);
                if (y1 > y2) {
                        y = y2;
                        x = x2;
                        yend = y1;
                        xdirflag = (-1);
                } else {
                        y = y1;
                        x = x1;
                        yend = y2;
                        xdirflag = 1;
                }
                dashedSet;
                if (((x2 - x1) * xdirflag) > 0) {
                        while (y < yend) {
                                y++;
                                if (d <0) {
                                        d+=incr1;
                                } else {
                                        x++;
                                        d+=incr2;
                                }
                                dashedSet;
                        }
                } else {
                        while (y < yend) {
                                y++;
                                if (d <0) {
                                        d+=incr1;
                                } else {
                                        x--;
                                        d+=incr2;
                                }
                                dashedSet;
                        }
                }
        }
}

int gdImageBoundsSafe(gdImagePtr im, int x, int y)
/* [<][>][^][v][top][bottom][index][help] */
{
        return (!(((y < 0) || (y >= im->sy)) ||
                ((x < 0) || (x >= im->sx))));
}

void gdImageChar(gdImagePtr im, gdFontPtr f, int x, int y, int c, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        int cx, cy;
        int px, py;
        int fline;
        cx = 0;
        cy = 0;
        if ((c < f->offset) || (c >= (f->offset + f->nchars))) {
                return;
        }
        fline = (c - f->offset) * f->h * f->w;
        for (py = y; (py < (y + f->h)); py++) {
                for (px = x; (px < (x + f->w)); px++) {
                        if (f->data[fline + cy * f->w + cx]) {
                                gdImageSetPixel(im, px, py, color);     
                        }
                        cx++;
                }
                cx = 0;
                cy++;
        }
}

void gdImageCharUp(gdImagePtr im, gdFontPtr f, int x, int y, int c, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        int cx, cy;
        int px, py;
        int fline;
        cx = 0;
        cy = 0;
        if ((c < f->offset) || (c >= (f->offset + f->nchars))) {
                return;
        }
        fline = (c - f->offset) * f->h * f->w;
        for (py = y; (py > (y - f->w)); py--) {
                for (px = x; (px < (x + f->h)); px++) {
                        if (f->data[fline + cy * f->w + cx]) {
                                gdImageSetPixel(im, px, py, color);     
                        }
                        cy++;
                }
                cy = 0;
                cx++;
        }
}

void gdImageString(gdImagePtr im, gdFontPtr f, int x, int y, char *s, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        int i;
        int l;
        l = strlen(s);
        for (i=0; (i<l); i++) {
                gdImageChar(im, f, x, y, (unsigned char)s[i], color);
                x += f->w;
        }
}

void gdImageStringUp(gdImagePtr im, gdFontPtr f, int x, int y, char *s, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        int i;
        int l;
        l = strlen(s);
        for (i=0; (i<l); i++) {
                gdImageCharUp(im, f, x, y, (unsigned char)s[i], color);
                y -= f->w;
        }
}

/* s and e are integers modulo 360 (degrees), with 0 degrees
  being the rightmost extreme and degrees changing clockwise.
  cx and cy are the center in pixels; w and h are the horizontal 
  and vertical diameter in pixels. Nice interface, but slow, since
  I don't yet use Bresenham (I'm using an inefficient but
  simple solution with too much work going on in it; generalizing
  Bresenham to ellipses and partial arcs of ellipses is non-trivial,
  at least for me) and there are other inefficiencies (small circles
  do far too much work). */

void gdImageArc(gdImagePtr im, int cx, int cy, int w, int h, int s, int e, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        int i;
        int lx = 0, ly = 0;
        int w2, h2;
        w2 = w/2;
        h2 = h/2;
        while (e < s) {
                e += 360;
        }
        for (i=s; (i <= e); i++) {
                int x, y;
                x = ((long)cost[i % 360] * (long)w2 / costScale) + cx; 
                y = ((long)sint[i % 360] * (long)h2 / sintScale) + cy;
                if (i != s) {
                        gdImageLine(im, lx, ly, x, y, color);   
                }
                lx = x;
                ly = y;
        }
}


#if 0
        /* Bresenham octant code, which I should use eventually */
        int x, y, d;
        x = 0;
        y = w;
        d = 3-2*w;
        while (x < y) {
                gdImageSetPixel(im, cx+x, cy+y, color);
                if (d < 0) {
                        d += 4 * x + 6;
                } else {
                        d += 4 * (x - y) + 10;
                        y--;
                }
                x++;
        }
        if (x == y) {
                gdImageSetPixel(im, cx+x, cy+y, color);
        }
#endif

void gdImageFillToBorder(gdImagePtr im, int x, int y, int border, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        int lastBorder;
        /* Seek left */
        int leftLimit, rightLimit;
        int i;
        leftLimit = (-1);
        if (border < 0) {
                /* Refuse to fill to a non-solid border */
                return;
        }
        for (i = x; (i >= 0); i--) {
                if (gdImageGetPixel(im, i, y) == border) {
                        break;
                }
                gdImageSetPixel(im, i, y, color);
                leftLimit = i;
        }
        if (leftLimit == (-1)) {
                return;
        }
        /* Seek right */
        rightLimit = x;
        for (i = (x+1); (i < im->sx); i++) {    
                if (gdImageGetPixel(im, i, y) == border) {
                        break;
                }
                gdImageSetPixel(im, i, y, color);
                rightLimit = i;
        }
        /* Look at lines above and below and start paints */
        /* Above */
        if (y > 0) {
                lastBorder = 1;
                for (i = leftLimit; (i <= rightLimit); i++) {
                        int c;
                        c = gdImageGetPixel(im, i, y-1);
                        if (lastBorder) {
                                if ((c != border) && (c != color)) {    
                                        gdImageFillToBorder(im, i, y-1, 
                                                border, color);         
                                        lastBorder = 0;
                                }
                        } else if ((c == border) || (c == color)) {
                                lastBorder = 1;
                        }
                }
        }
        /* Below */
        if (y < ((im->sy) - 1)) {
                lastBorder = 1;
                for (i = leftLimit; (i <= rightLimit); i++) {
                        int c;
                        c = gdImageGetPixel(im, i, y+1);
                        if (lastBorder) {
                                if ((c != border) && (c != color)) {    
                                        gdImageFillToBorder(im, i, y+1, 
                                                border, color);         
                                        lastBorder = 0;
                                }
                        } else if ((c == border) || (c == color)) {
                                lastBorder = 1;
                        }
                }
        }
}

void gdImageFill(gdImagePtr im, int x, int y, int color)
/* [<][>][^][v][top][bottom][index][help] */
{
        int lastBorder;
        int old;
        int leftLimit, rightLimit;
        int i;
        old = gdImageGetPixel(im, x, y);
        if (color == gdTiled) {
                /* Tile fill -- got to watch out! */
                int p, tileColor;       
                int srcx, srcy;
                if (!im->tile) {
                        return;
                }
                /* Refuse to flood-fill with a transparent pattern --
                        I can't do it without allocating another image */
                if (gdImageGetTransparent(im->tile) != (-1)) {
                        return;
                }       
                srcx = x % gdImageSX(im->tile);
                srcy = y % gdImageSY(im->tile);
                p = gdImageGetPixel(im->tile, srcx, srcy);
                tileColor = im->tileColorMap[p];
                if (old == tileColor) {
                        /* Nothing to be done */
                        return;
                }
        } else {
                if (old == color) {
                        /* Nothing to be done */
                        return;
                }
        }
        /* Seek left */
        leftLimit = (-1);
        for (i = x; (i >= 0); i--) {
                if (gdImageGetPixel(im, i, y) != old) {
                        break;
                }
                gdImageSetPixel(im, i, y, color);
                leftLimit = i;
        }
        if (leftLimit == (-1)) {
                return;
        }
        /* Seek right */
        rightLimit = x;
        for (i = (x+1); (i < im->sx); i++) {    
                if (gdImageGetPixel(im, i, y) != old) {
                        break;
                }
                gdImageSetPixel(im, i, y, color);
                rightLimit = i;
        }
        /* Look at lines above and below and start paints */
        /* Above */
        if (y > 0) {
                lastBorder = 1;
                for (i = leftLimit; (i <= rightLimit); i++) {
                        int c;
                        c = gdImageGetPixel(im, i, y-1);
                        if (lastBorder) {
                                if (c == old) { 
                                        gdImageFill(im, i, y-1, color);         
                                        lastBorder = 0;
                                }
                        } else if (c != old) {
                                lastBorder = 1;
                        }
                }
        }
        /* Below */
        if (y < ((im->sy) - 1)) {
                lastBorder = 1;
                for (i = leftLimit; (i <= rightLimit); i++) {
                        int c;
                        c = gdImageGetPixel(im, i, y+1);
                        if (lastBorder) {
                                if (c == old) {
                                        gdImageFill(im, i, y+1, color);         
                                        lastBorder = 0;
                                }
                        } else if (c != old) {
                                lastBorder = 1;
                        }
                }
        }
}
        
#ifdef TEST_CODE
void gdImageDump(gdImagePtr im)
/* [<][>][^][v][top][bottom][index][help] */
{
        int i, j;
        for (i=0; (i < im->sy); i++) {
                for (j=0; (j < im->sx); j++) {
                        printf("%d", im->pixels[j][i]);
                }
                printf("\n");
        }
}
#endif

/* Code drawn from ppmtogif.c, from the pbmplus package
**
** Based on GIFENCOD by David Rowley <mgardi@watdscu.waterloo.edu>. A
** Lempel-Zim compression based on "compress".
**
** Modified by Marcel Wijkstra <wijkstra@fwi.uva.nl>
**
** Copyright (C) 1989 by Jef Poskanzer.
**
** Permission to use, copy, modify, and distribute this software and its
** documentation for any purpose and without fee is hereby granted, provided
** that the above copyright notice appear in all copies and that both that
** copyright notice and this permission notice appear in supporting
** documentation.  This software is provided "as is" without express or
** implied warranty.
**
** The Graphics Interchange Format(c) is the Copyright property of
** CompuServe Incorporated.  GIF(sm) is a Service Mark property of
** CompuServe Incorporated.
*/

/*
 * a code_int must be able to hold 2**GIFBITS values of type int, and also -1
 */
typedef int             code_int;

#ifdef SIGNED_COMPARE_SLOW
typedef unsigned long int count_int;
typedef unsigned short int count_short;
#else /*SIGNED_COMPARE_SLOW*/
typedef long int          count_int;
#endif /*SIGNED_COMPARE_SLOW*/

/* this is used for creating GIFs in main memory*/
typedef struct dpStruct {
  void* data;
  int logicalSize;
  int realSize;
  int dataGood;
} dynamicPtr;

static int colorstobpp(int colors);
static void BumpPixel (void);
static int GIFNextPixel (gdImagePtr im);
static void GIFEncode (dynamicPtr *dp, int GWidth, int GHeight, 
                       int GInterlace, int Background, int Transparent, int BitsPerPixel, 
                       int *Red, int *Green, int *Blue, gdImagePtr im);
static void Putword (int w, dynamicPtr* dp);
static void Putchar(int a, dynamicPtr* dp);
static void compress (int init_bits, dynamicPtr* dp, gdImagePtr im);
static void output (code_int code);
static void cl_block (void);
static void cl_hash (register count_int hsize);
static void char_init (void);
static void char_out (int c);
static void flush_char (void);
/* Allows for reuse */
static void init_statics(void);

/* these functions operate on in-memory dynamic pointers */
static int allocDynamic (dynamicPtr* dp,int initialSize);
static int appendDynamic (dynamicPtr* dp, const void* src, int size);
static int reallocDynamic (dynamicPtr* dp, int required);
static int trimDynamic (dynamicPtr* dp);
static void freeDynamic (dynamicPtr* dp);
static dynamicPtr* gdImageGifData (gdImagePtr im);

/* return data as a dynamic pointer */
static dynamicPtr* gdImageGifData (gdImagePtr im) {
/* [<][>][^][v][top][bottom][index][help] */
  int interlace, transparent, BitsPerPixel;
  dynamicPtr* dp;
  dp = (dynamicPtr*) malloc(sizeof(dynamicPtr));
  if (dp == NULL) {
    return NULL;
  }

  if (!allocDynamic(dp,1024))
    return NULL;

  interlace = im->interlace;
  transparent = im->transparent;
  BitsPerPixel = colorstobpp(im->colorsTotal);

  /* Clear any old values in statics strewn through the GIF code */
  init_statics();
  /* All set, let's do it. */

  GIFEncode(
            dp, im->sx, im->sy, interlace, 0, transparent, BitsPerPixel,
            im->red, im->green, im->blue, im);
  /* if there were problems along the way, we clean up and return NULL */
  if (dp->dataGood) {
    trimDynamic(dp);
    return dp;
  } else {
    freeDynamic(dp);
    free(dp);
    return NULL;
  }
}

void gdImageGif(gdImagePtr im, FILE *out)
/* [<][>][^][v][top][bottom][index][help] */
{
  dynamicPtr* dp;
  dp = gdImageGifData(im);
  if (dp == NULL)
    return;

  /* print the file to output */
  fwrite(dp->data,1,dp->logicalSize,out);

  /* get rid of the data -- we're done with it */
  freeDynamic(dp);
  free(dp);
}

void* gdImageGifPtr(gdImagePtr im, int* size) {
/* [<][>][^][v][top][bottom][index][help] */
  dynamicPtr* dp;
  void* data;
  *size = 0;

  dp = gdImageGifData(im);
  if (dp == NULL)
    return NULL;

  *size = dp->logicalSize;
  data = dp->data;
  free(dp);
  return data;
}

static int
colorstobpp(int colors)
/* [<][>][^][v][top][bottom][index][help] */
{
    int bpp = 0;

    if ( colors <= 2 )
        bpp = 1;
    else if ( colors <= 4 )
        bpp = 2;
    else if ( colors <= 8 )
        bpp = 3;
    else if ( colors <= 16 )
        bpp = 4;
    else if ( colors <= 32 )
        bpp = 5;
    else if ( colors <= 64 )
        bpp = 6;
    else if ( colors <= 128 )
        bpp = 7;
    else if ( colors <= 256 )
        bpp = 8;
    return bpp;
    }

/*****************************************************************************
 *
 * GIFENCODE.C    - GIF Image compression interface
 *
 * GIFEncode( FName, GHeight, GWidth, GInterlace, Background, Transparent,
 *            BitsPerPixel, Red, Green, Blue, gdImagePtr )
 *
 *****************************************************************************/

static int Width, Height;
static int curx, cury;
static long CountDown;
static int Pass = 0;
static int Interlace;

/*
 * Bump the 'curx' and 'cury' to point to the next pixel
 */
static void
BumpPixel(void)
/* [<][>][^][v][top][bottom][index][help] */
{
        /*
         * Bump the current X position
         */
        ++curx;

        /*
         * If we are at the end of a scan line, set curx back to the beginning
         * If we are interlaced, bump the cury to the appropriate spot,
         * otherwise, just increment it.
         */
        if( curx == Width ) {
                curx = 0;

                if( !Interlace )
                        ++cury;
                else {
                     switch( Pass ) {

                       case 0:
                          cury += 8;
                          if( cury >= Height ) {
                                ++Pass;
                                cury = 4;
                          }
                          break;

                       case 1:
                          cury += 8;
                          if( cury >= Height ) {
                                ++Pass;
                                cury = 2;
                          }
                          break;

                       case 2:
                          cury += 4;
                          if( cury >= Height ) {
                             ++Pass;
                             cury = 1;
                          }
                          break;

                       case 3:
                          cury += 2;
                          break;
                        }
                }
        }
}

/*
 * Return the next pixel from the image
 */
static int
GIFNextPixel(gdImagePtr im)
/* [<][>][^][v][top][bottom][index][help] */
{
        int r;

        if( CountDown == 0 )
                return EOF;

        --CountDown;

        r = gdImageGetPixel(im, curx, cury);

        BumpPixel();

        return r;
}

/* public */

static void
GIFEncode(dynamicPtr *dp, int GWidth, int GHeight, 
/* [<][>][^][v][top][bottom][index][help] */
          int GInterlace, int Background, int Transparent, int BitsPerPixel, 
          int *Red, int *Green, int *Blue, 
          gdImagePtr im)
{
  int B;
  int RWidth, RHeight;
  int LeftOfs, TopOfs;
  int Resolution;
  int ColorMapSize;
  int InitCodeSize;
  int i;
  
  Interlace = GInterlace;
  
  ColorMapSize = 1 << BitsPerPixel;
  
  RWidth = Width = GWidth;
  RHeight = Height = GHeight;
  LeftOfs = TopOfs = 0;
  
  Resolution = BitsPerPixel;

  /*
   * Calculate number of bits we are expecting
   */
  CountDown = (long)Width * (long)Height;
  
  /*
   * Indicate which pass we are on (if interlace)
   */
  Pass = 0;
  
  /*
   * The initial code size
   */
  if( BitsPerPixel <= 1 )
    InitCodeSize = 2;
  else
    InitCodeSize = BitsPerPixel;
  
  /*
   * Set up the current x and y position
   */
  curx = cury = 0;
  
  /*
   * Write the Magic header
   */
  appendDynamic(dp,Transparent < 0 ? "GIF87a" : "GIF89a",6);
  
  /*
   * Write out the screen width and height
   */
  Putword( RWidth, dp );
  Putword( RHeight, dp );
  
  /*
   * Indicate that there is a global colour map
   */
  B = 0x80;       /* Yes, there is a color map */
  
  /*
   * OR in the resolution
   */
  B |= (Resolution - 1) << 5;
  
  /*
   * OR in the Bits per Pixel
   */
  B |= (BitsPerPixel - 1);
  
  /*
   * Write it out
   */
  Putchar( B, dp );

  /*
   * Write out the Background colour
   */
  Putchar ( Background, dp );
  
  /*
   * Byte of 0's (future expansion)
   */
  Putchar( 0, dp );

  /*
   * Write out the Global Colour Map
   */
  for( i=0; i<ColorMapSize; ++i ) {
    Putchar( Red[i], dp );
    Putchar( Green[i], dp );
    Putchar( Blue[i], dp );
  }
  
  /*
   * Write out extension for transparent colour index, if necessary.
   */
  if ( Transparent >= 0 ) {
    Putchar( '!', dp );
    Putchar( 0xf9, dp );
    Putchar( 4, dp );
    Putchar( 1, dp );
    Putchar( 0, dp );
    Putchar( 0, dp );
    Putchar( (unsigned char) Transparent, dp );
    Putchar( 0, dp );
  }
  
  /*
   * Write an Image separator
   */
  Putchar( ',', dp );
  
  /*
   * Write the Image header
   */
  
  Putword( LeftOfs, dp );
  Putword( TopOfs, dp );
  Putword( Width, dp );
  Putword( Height, dp );
  
  /*
   * Write out whether or not the image is interlaced
   */
  if( Interlace )
    Putchar( 0x40, dp );
  else
    Putchar( 0x00, dp );
  
  /*
   * Write out the initial code size
   */
  Putchar( InitCodeSize, dp );
  
  /*
   * Go and actually compress the data
   */
  compress( InitCodeSize+1, dp, im );
  
  /*
   * Write out a Zero-length packet (to end the series)
   */
  Putchar( 0, dp );
  
  /*
   * Write the GIF file terminator
   */
  Putchar( ';', dp );
}

/*
 * Write out a word to the GIF pointer
 */
static void
Putword(int w, dynamicPtr* dp)
/* [<][>][^][v][top][bottom][index][help] */
{
  Putchar( w & 0xff, dp );
  Putchar( (w / 256) & 0xff, dp );
}

/*
 * Write out a character to the GIF pointer
 */
static void
Putchar(int a, dynamicPtr* dp)
/* [<][>][^][v][top][bottom][index][help] */
{
  unsigned char b;
  b = a;
  appendDynamic(dp,&b,1);
}

/***************************************************************************
 *
 *  GIFCOMPR.C       - GIF Image compression routines
 *
 *  Lempel-Ziv compression based on 'compress'.  GIF modifications by
 *  David Rowley (mgardi@watdcsu.waterloo.edu)
 *
 ***************************************************************************/

/*
 * General DEFINEs
 */

#define GIFBITS    12

#define HSIZE  5003            /* 80% occupancy */

#ifdef NO_UCHAR
 typedef char   char_type;
#else /*NO_UCHAR*/
 typedef        unsigned char   char_type;
#endif /*NO_UCHAR*/

/*
 *
 * GIF Image compression - modified 'compress'
 *
 * Based on: compress.c - File compression ala IEEE Computer, June 1984.
 *
 * By Authors:  Spencer W. Thomas       (decvax!harpo!utah-cs!utah-gr!thomas)
 *              Jim McKie               (decvax!mcvax!jim)
 *              Steve Davies            (decvax!vax135!petsd!peora!srd)
 *              Ken Turkowski           (decvax!decwrl!turtlevax!ken)
 *              James A. Woods          (decvax!ihnp4!ames!jaw)
 *              Joe Orost               (decvax!vax135!petsd!joe)
 *
 */
#include <ctype.h>

#define ARGVAL() (*++(*argv) || (--argc && *++argv))
/* [<][>][^][v][top][bottom][index][help] */

static int n_bits;                        /* number of bits/code */
static int maxbits = GIFBITS;                /* user settable max # bits/code */
static code_int maxcode;                  /* maximum code, given n_bits */
static code_int maxmaxcode = (code_int)1 << GIFBITS; /* should NEVER generate this code */
#ifdef COMPATIBLE               /* But wrong! */
# define MAXCODE(n_bits)        ((code_int) 1 << (n_bits) - 1)
/* [<][>][^][v][top][bottom][index][help] */
#else /*COMPATIBLE*/
# define MAXCODE(n_bits)        (((code_int) 1 << (n_bits)) - 1)
/* [<][>][^][v][top][bottom][index][help] */
#endif /*COMPATIBLE*/

static count_int htab [HSIZE];
static unsigned short codetab [HSIZE];
#define HashTabOf(i)       htab[i]
/* [<][>][^][v][top][bottom][index][help] */
#define CodeTabOf(i)    codetab[i]
/* [<][>][^][v][top][bottom][index][help] */

static code_int hsize = HSIZE;                 /* for dynamic table sizing */

/*
 * To save much memory, we overlay the table used by compress() with those
 * used by decompress().  The tab_prefix table is the same size and type
 * as the codetab.  The tab_suffix table needs 2**GIFBITS characters.  We
 * get this from the beginning of htab.  The output stack uses the rest
 * of htab, and contains characters.  There is plenty of room for any
 * possible stack (stack used to be 8000 characters).
 */

#define tab_prefixof(i) CodeTabOf(i)
/* [<][>][^][v][top][bottom][index][help] */
#define tab_suffixof(i)        ((char_type*)(htab))[i]
/* [<][>][^][v][top][bottom][index][help] */
#define de_stack               ((char_type*)&tab_suffixof((code_int)1<<GIFBITS))

static code_int free_ent = 0;                  /* first unused entry */

/*
 * block compression parameters -- after all codes are used up,
 * and compression rate changes, start over.
 */
static int clear_flg = 0;

static int offset;
static long int in_count = 1;            /* length of input */
static long int out_count = 0;           /* # of codes output (for debugging) */

/*
 * compress stdin to stdout
 *
 * Algorithm:  use open addressing double hashing (no chaining) on the
 * prefix code / next character combination.  We do a variant of Knuth's
 * algorithm D (vol. 3, sec. 6.4) along with G. Knott's relatively-prime
 * secondary probe.  Here, the modular division first probe is gives way
 * to a faster exclusive-or manipulation.  Also do block compression with
 * an adaptive reset, whereby the code table is cleared when the compression
 * ratio decreases, but after the table fills.  The variable-length output
 * codes are re-sized at this point, and a special CLEAR code is generated
 * for the decompressor.  Late addition:  construct the table according to
 * file size for noticeable speed improvement on small files.  Please direct
 * questions about this implementation to ames!jaw.
 */

static int g_init_bits;
static dynamicPtr* g_outptr;

static int ClearCode;
static int EOFCode;

static void
compress(int init_bits, dynamicPtr* dp, gdImagePtr im)
/* [<][>][^][v][top][bottom][index][help] */
{
    register long fcode;
    register code_int i /* = 0 */;
    register int c;
    register code_int ent;
    register code_int disp;
    register code_int hsize_reg;
    register int hshift;

    /*
     * Set up the globals:  g_init_bits - initial number of bits
     *                      g_outfile   - pointer to output file
     */
    g_init_bits = init_bits;
    g_outptr = dp;

    /*
     * Set up the necessary values
     */
    offset = 0;
    out_count = 0;
    clear_flg = 0;
    in_count = 1;
    maxcode = MAXCODE(n_bits = g_init_bits);

    ClearCode = (1 << (init_bits - 1));
    EOFCode = ClearCode + 1;
    free_ent = ClearCode + 2;

    char_init();

    ent = GIFNextPixel( im );

    hshift = 0;
    for ( fcode = (long) hsize;  fcode < 65536L; fcode *= 2L )
        ++hshift;
    hshift = 8 - hshift;                /* set hash code range bound */

    hsize_reg = hsize;
    cl_hash( (count_int) hsize_reg);            /* clear hash table */

    output( (code_int)ClearCode );

#ifdef SIGNED_COMPARE_SLOW
    while ( (c = GIFNextPixel( im )) != (unsigned) EOF ) {
#else /*SIGNED_COMPARE_SLOW*/
    while ( (c = GIFNextPixel( im )) != EOF ) {  /* } */
#endif /*SIGNED_COMPARE_SLOW*/

        ++in_count;

        fcode = (long) (((long) c << maxbits) + ent);
        i = (((code_int)c << hshift) ^ ent);    /* xor hashing */

        if ( HashTabOf (i) == fcode ) {
            ent = CodeTabOf (i);
            continue;
        } else if ( (long)HashTabOf (i) < 0 )      /* empty slot */
            goto nomatch;
        disp = hsize_reg - i;           /* secondary hash (after G. Knott) */
        if ( i == 0 )
            disp = 1;
probe:
        if ( (i -= disp) < 0 )
            i += hsize_reg;

        if ( HashTabOf (i) == fcode ) {
            ent = CodeTabOf (i);
            continue;
        }
        if ( (long)HashTabOf (i) > 0 )
            goto probe;
nomatch:
        output ( (code_int) ent );
        ++out_count;
        ent = c;
#ifdef SIGNED_COMPARE_SLOW
        if ( (unsigned) free_ent < (unsigned) maxmaxcode) {
#else /*SIGNED_COMPARE_SLOW*/
        if ( free_ent < maxmaxcode ) {  /* } */
#endif /*SIGNED_COMPARE_SLOW*/
            CodeTabOf (i) = free_ent++; /* code -> hashtable */
            HashTabOf (i) = fcode;
        } else
                cl_block();
    }
    /*
     * Put out the final code.
     */
    output( (code_int)ent );
    ++out_count;
    output( (code_int) EOFCode );
}

/*****************************************************************
 * TAG( output )
 *
 * Output the given code.
 * Inputs:
 *      code:   A n_bits-bit integer.  If == -1, then EOF.  This assumes
 *              that n_bits =< (long)wordsize - 1.
 * Outputs:
 *      Outputs code to the file.
 * Assumptions:
 *      Chars are 8 bits long.
 * Algorithm:
 *      Maintain a GIFBITS character long buffer (so that 8 codes will
 * fit in it exactly).  Use the VAX insv instruction to insert each
 * code in turn.  When the buffer fills up empty it and start over.
 */

static unsigned long cur_accum = 0;
static int cur_bits = 0;

static unsigned long masks[] = { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
                                  0x001F, 0x003F, 0x007F, 0x00FF,
                                  0x01FF, 0x03FF, 0x07FF, 0x0FFF,
                                  0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF };

static void
output(code_int code)
/* [<][>][^][v][top][bottom][index][help] */
{
    cur_accum &= masks[ cur_bits ];

    if( cur_bits > 0 )
        cur_accum |= ((long)code << cur_bits);
    else
        cur_accum = code;

    cur_bits += n_bits;

    while( cur_bits >= 8 ) {
        char_out( (unsigned int)(cur_accum & 0xff) );
        cur_accum >>= 8;
        cur_bits -= 8;
    }

    /*
     * If the next entry is going to be too big for the code size,
     * then increase it, if possible.
     */
   if ( free_ent > maxcode || clear_flg ) {

     if( clear_flg ) {

       maxcode = MAXCODE (n_bits = g_init_bits);
       clear_flg = 0;
       
     } else {

       ++n_bits;
       if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else
if ( n_bits == maxbits )
         maxcode = maxmaxcode;
       else